#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
#include "sys/ioctl.h"
#include "sys/select.h"
#include "poll.h"
/***************************************************************
Copyright © ALIENTEK Co., Ltd. 1998-2029. All rights reserved.
文件名		: blockApp.c
作者	  	: 左忠凯
版本	   	: V1.0
描述	   	: 阻塞访问测试APP
其他	   	: 无
使用方法	：./blockApp /dev/blockio 打开测试App
论坛 	   	: www.openedv.com
日志	   	: 初版V1.0 2019/9/8 左忠凯创建
***************************************************************/

/*
 * @description		: main主程序
 * @param - argc 	: argv数组元素个数
 * @param - argv 	: 具体参数
 * @return 			: 0 成功;其他 失败
 */
int main(int argc, char *argv[])
{
	//使用select函数实现非阻塞读取
	// fd_set readfds;
	// struct timeval timeout;
	//使用poll函数实现非阻塞读取
	struct pollfd fds;
	int fd;
	int ret = 0;
	char *filename;
	unsigned char data;

	if (argc != 2) {
		printf("Error Usage!\r\n");
		return -1;
	}

	filename = argv[1];
	fd = open(filename, O_RDWR | O_NONBLOCK);
	if (fd < 0) {
		printf("Can't open file %s\r\n", filename);
		return -1;
	}
#if 0
	while (1) {
		FD_ZERO(&readfds);
		FD_SET(fd, &readfds);
		timeout.tv_sec = 0;
		timeout.tv_usec = 500000;	/* 500ms */
		ret = select(fd + 1, &readfds, NULL, NULL, &timeout);
		switch (ret)
        {
        case 0: // 超时
            //printf("select timeout\r\n");
            break;
        case -1: // 错误
            break;
        default: // 可以读取数据
            if (FD_ISSET(fd, &readfds))
            {
                ret = read(fd, &data, sizeof(data));
                if (ret < 0)
                {

                }
                else
                {
                    if (data)
                    {
                        printf("key value is %#x\r\n", data);
                    }
                }
            }
            break;
        }
	}
#endif
	while (1) {
		fds.fd = fd;
		fds.events = POLLIN;
		ret = poll(&fds, 1, 500);	/* 500ms */
		if (ret == 0) {
			//printf("poll timeout\r\n");
		} else if (ret < 0) {
			break;
		} else {
			if (fds.revents & POLLIN) {
				ret = read(fd, &data, sizeof(data));
				if (ret < 0) {
					break;
				} else {
					if (data) {
						printf("key value is %#x\r\n", data);
					}
				}
			}
		}
	}


	close(fd);
	return ret;
}
